/*
 * selekcja.h
 *
 * Copyright (C) 2008, 2009
 *
 * Lukasz Bieniasz-Krzywiec
 * Dariusz Leniowski
 */

#ifndef SELEKCJA_H_
#define SELEKCJA_H_

#include "../config.h"

class selekcja {
public:
  selekcja() {}
  virtual ~selekcja() {}

  /*
   * Wykonaj selekcje.
   * Zalozenia:
   * - N to zmienna globalna oznaczajaca rozmiar populacji, N >= 2,
   * - populacja znajduje sie w zmiennej globalnej populacja,
   * - fitness_osobnik to numery osobnikow posortowane po przystosowaniu,
   * - osobnik_fitness to permutacja odrwotna do fotness_osobnik
   * Wynik:
   * - w populacji zaszedl krok ewolucji
   */
  virtual void wykonaj() = 0;
};

class selekcja_prosta : public selekcja {
	real prawd_bledu;
public:
  selekcja_prosta();
  selekcja_prosta(real);
  ~selekcja_prosta();

  void wykonaj();
};

class selekcja_imitacja : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja();
  selekcja_imitacja(real);
  ~selekcja_imitacja();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_imitacja_wszystkie : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_wszystkie();
  selekcja_imitacja_wszystkie(real);
  ~selekcja_imitacja_wszystkie();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_proces_morana : public selekcja {
public:
  selekcja_proces_morana();
  ~selekcja_proces_morana();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_proces_morana_artykul : public selekcja {
  real prawd_bledu;
public:
  selekcja_proces_morana_artykul();
  selekcja_proces_morana_artykul(real);
  ~selekcja_proces_morana_artykul();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_proces_morana_wszystkie_artykul : public selekcja {
  real prawd_bledu;
public:
  selekcja_proces_morana_wszystkie_artykul();
  selekcja_proces_morana_wszystkie_artykul(real);
  ~selekcja_proces_morana_wszystkie_artykul();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_imitacja_rodzajow : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow();
  selekcja_imitacja_rodzajow(real);
  ~selekcja_imitacja_rodzajow();

  /*
   * Wybieramy losowy wierzchołek. Liczymy sumy fitnesów rodzajów jego sąsiadów.
   * Wybieramy rodzaj o największej sumie wypłat.
   */
  void wykonaj();
};

class selekcja_imitacja_rodzajow_wszystkie : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow_wszystkie();
  selekcja_imitacja_rodzajow_wszystkie(real);
  ~selekcja_imitacja_rodzajow_wszystkie();

  /*
   * Jak wyżej, ale dla każdego wierzchołka.
   */
  void wykonaj();
};

class selekcja_proces_morana_darek : public selekcja {
  real prawd_bledu;
public:
  selekcja_proces_morana_darek();
  selekcja_proces_morana_darek(real);
  ~selekcja_proces_morana_darek();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_proces_morana_wszystkie_darek : public selekcja {
  real prawd_bledu;
public:
  selekcja_proces_morana_wszystkie_darek();
  selekcja_proces_morana_wszystkie_darek(real);
  ~selekcja_proces_morana_wszystkie_darek();

  /*
   * TODO
   */
  void wykonaj();
};

class selekcja_imitacja_rodzajow2 : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow2();
  selekcja_imitacja_rodzajow2(real);
  ~selekcja_imitacja_rodzajow2();

  /*
   * Wybieramy losowy wierzchołek. Liczymy sumy fitnesów rodzajów jego sąsiadów.
   * Wybieramy rodzaj o największej sumie wypłat.
   */
  void wykonaj();
};

class selekcja_imitacja_rodzajow2_wszystkie : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow2_wszystkie();
  selekcja_imitacja_rodzajow2_wszystkie(real);
  ~selekcja_imitacja_rodzajow2_wszystkie();

  /*
   * Jak wyżej, ale dla każdego wierzchołka.
   */
  void wykonaj();
};



class selekcja_imitacja_rodzajow3 : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow3();
  selekcja_imitacja_rodzajow3(real);
  ~selekcja_imitacja_rodzajow3();

  /*
   * Wybieramy losowy wierzchołek. Liczymy sumy fitnesów rodzajów jego sąsiadów.
   * Wybieramy rodzaj o największej sumie wypłat.
   */
  void wykonaj();
};

class selekcja_imitacja_rodzajow3_wszystkie : public selekcja {
  real prawd_bledu;
public:
  selekcja_imitacja_rodzajow3_wszystkie();
  selekcja_imitacja_rodzajow3_wszystkie(real);
  ~selekcja_imitacja_rodzajow3_wszystkie();

  /*
   * Jak wyżej, ale dla każdego wierzchołka.
   */
  void wykonaj();
};


#endif /* SELEKCJA_H_ */
